4517
23325
Bu gönderiyi geliştirmek mi istiyorsunuz? Alıntılar ve cevabınızın neden doğru olduğuna dair bir açıklama dahil olmak üzere bu soruya ayrıntılı cevaplar verin. Yeterli ayrıntıya sahip olmayan cevaplar düzenlenebilir veya silinebilir.
Şu komutu kullanarak yanlışlıkla Git'e dosya ekledim:
git dosyam.txt ekle
Henüz git commit'i çalıştırmadım. Bunu geri almanın bir yolu var mı, böylece bu dosyalar işleme dahil edilmeyecek mi? 
1
2
Sonraki
İle kaydetmeden önce git add işlemini geri alabilirsiniz
git reset 
bu, onu başka hiçbir şeyi değiştirmeden mevcut dizinden ("işlenmek üzere" listesi) kaldıracaktır.
Kullanabilirsiniz
git sıfırla
tüm değişiklikleri geri almak için herhangi bir dosya adı olmadan. Bu, makul bir süre içinde tek tek listelenemeyecek kadar çok dosya olduğunda kullanışlı olabilir.
Git'in eski sürümlerinde, yukarıdaki komutlar sırasıyla git reset HEAD  ve git reset HEAD ile eşdeğerdir ve HEAD tanımlanmamışsa (çünkü deponuzda henüz herhangi bir işlem yapmadıysanız) veya belirsizse (çünkü Yapmamanız gereken aptalca bir şey olan HEAD adlı bir dal oluşturdu. Bu, Git 1.8.2'de değiştirildi, bu nedenle Git'in modern sürümlerinde, ilk işleminizi yapmadan önce bile yukarıdaki komutları kullanabilirsiniz:
"git reset" (seçenekler veya parametreler olmadan),
tarihinizde herhangi bir işleminiz yok, ancak şimdi size
boş bir dizin (var olmadığınız bir işlemle eşleşmek için bile).
Belgeler: git sıfırlama
|
İstediğiniz:
git rm --cached 
Muhakeme:
Bunda yeniyken ilk denedim
git sıfırla.
(ilk eklememin tamamını geri almak için), yalnızca bu (öyle değil) yararlı mesajı almak için:
ölümcül: "HEAD" geçerli bir referans olarak çözümlenemedi.
Bunun nedeni, HEAD ref (dal?) 'In ilk kesinleştirme sonrasına kadar var olmamasıdır. Yani, benimki gibi iş akışınız şunun gibi bir şeyse, benimle aynı başlangıç ​​problemiyle karşılaşacaksınız:
Git'i denemek için harika yeni proje dizinime cd, yeni güzellik
git init
git ekle.
git durumu
... bir sürü boktan parşömen ...
=> Kahretsin, hepsini eklemek istemedim.
google "git eklemeyi geri al"
=> Stack Overflow'u bul - yay
git sıfırla.
=> ölümcül: 'HEAD' geçerli bir referans olarak çözümlenemedi.
Ayrıca, posta listesinde bunun yararsız olmasına karşı kaydedilen bir hata olduğu ortaya çıkıyor.
Ve doğru çözümün tam da Git durum çıktısında bulunduğunu (ki evet, 'saçmalık' olarak geçtim)
...
# Yapılması gereken değişiklikler:
# (aşamayı kaldırmak için "git rm --cached  ..." kullanın)
...
Çözüm ise git rm --cached FILE kullanmaktır.
Buradaki diğer uyarılara dikkat edin - git rm dosyanın yerel çalışma kopyasını siler, ancak --cached kullanıyorsanız değil. İşte git help rm'nin sonucu:
- önbelleğe alınmış
Bu seçeneği, yolların aşamalarını kaldırmak ve dizinden kaldırmak için kullanın.
Değiştirilmiş olsun veya olmasın, çalışma ağacı dosyaları bırakılacaktır.
Kullanmaya devam ediyorum
git rm --cached.
her şeyi kaldırıp yeniden başlamak için. Ama işe yaramadı, çünkü eklerken. özyinelemeli, yinelenmesi için rm ihtiyacı ortaya çıkıyor. İç çekmek.
git rm -r --cached.
Tamam, şimdi başladığım yere geri döndüm. Bir dahaki sefere kuru çalıştırma yapmak için -n kullanacağım ve nelerin ekleneceğini göreceğim:
git eklenti -n.
Git help rm'ye --cached'in hiçbir şeyi yok etmeyeceğine güvenmeden önce her şeyi güvenli bir yere sıkıştırdım (ya da yanlış yazdıysam).
|
Yazarsanız:
git durumu
Git, aşamaların nasıl kaldırılacağına dair talimatlar dahil olmak üzere neyin aşamalandığını vb. Söyleyecektir:
aşamadan çıkmak için "git reset HEAD  ..." kullanın
Git'in böyle durumlarda doğru şeyi yapmam için beni dürtmek konusunda oldukça iyi bir iş yaptığını görüyorum.
Not: Son Git sürümleri (1.8.4.x) bu mesajı değiştirdi:
(aşamayı kaldırmak için "git rm --cached  ..." kullanın)
|
Açıklamak gerekirse: git add, değişiklikleri geçerli çalışma dizininden hazırlama alanına (dizin) taşır.
Bu sürece evreleme denir. Dolayısıyla, değişiklikleri (değiştirilen dosyaları) aşamalandırmak için en doğal komut en bariz olanıdır:
git aşaması
git add, git aşaması için yazması daha kolay bir takma addır
Yazık ki git unstage veya git unadd komutları yok. Alakalı olanı tahmin etmek veya hatırlamak daha zordur, ancak oldukça açıktır:
git sıfırlama KAFA -
Bunun için kolayca bir takma ad oluşturabiliriz:
git config --global alias.unadd 'HEAD'i sıfırla -'
git config --global alias.unstage 'HEAD'i sıfırla -'
Ve son olarak, yeni komutlarımız var:
git dosya1 ekle
git stage dosyası2
git unadd dosya2
git unstage dosya1
Şahsen ben daha da kısa takma adlar kullanıyorum:
git a # Evreleme için
git u # Aşamadan çıkarmak için
|
Kabul edilen yanıta ek olarak, yanlışlıkla eklenen dosyanız çok büyükse, onu dizinden 'git reset' ile kaldırdıktan sonra bile .git dizininde yer kaplıyor gibi göründüğünü muhtemelen fark edeceksiniz.
Bu endişelenecek bir şey değil; dosya aslında hala depodadır, ancak yalnızca "gevşek bir nesne" olarak. Diğer depolara kopyalanmayacak (klonlama, itme yoluyla) ve alan sonunda geri kazanılacak - belki de çok yakında değil. Endişeliyseniz, koşabilirsiniz:
git gc --prune = şimdi
Güncelleme (aşağıda en çok oy verilen cevaplardan doğabilecek bazı karışıklıkları giderme girişimim yer almaktadır):
Peki, git add'ın gerçek geri dönüşü hangisi?
git reset HEAD ?
veya
git rm --cached ?
Kesinlikle ve yanılmıyorsam: yok.
git add geri alınamaz - genel olarak güvenli bir şekilde.
Önce git add  öğesinin gerçekte ne yaptığını hatırlayalım:
 önceden izlenmemişse, git add onu şuraya ekler:mevcut içeriğiyle önbellek.
 zaten izlenmişse, git add mevcut içeriği (anlık görüntü, sürüm) önbelleğe kaydeder. Git'te, bu eyleme hala ekle (sadece güncelleme değil) olarak adlandırılır, çünkü bir dosyanın iki farklı sürümü (anlık görüntüleri) iki farklı öğe olarak kabul edilir: bu nedenle, gerçekten de önbelleğe yeni bir öğe ekliyoruz. daha sonra taahhüt edildi.
Bunun ışığında, soru biraz belirsiz:
Şu komutu kullanarak yanlışlıkla dosya ekledim ...
OP'nin senaryosu ilk (izlenmeyen dosya) gibi görünüyor, "geri al" ın dosyayı (sadece mevcut içerikleri değil) izlenen öğelerden kaldırmasını istiyoruz. Bu durumda git rm --cached  komutunu çalıştırabilirsiniz.
Ayrıca git reset HEAD  çalıştırabiliriz. Bu genellikle tercih edilir, çünkü her iki senaryoda da çalışır: zaten izlenmiş bir öğenin bir sürümünü yanlış bir şekilde eklediğimizde de geri alır.
Ancak iki uyarı var.
Birincisi: (cevapta belirtildiği gibi) git reset HEAD'in çalışmadığı sadece bir senaryo var, ancak git rm --cached çalışıyor: yeni bir depo (kaydetme yok). Ama gerçekten, bu pratik olarak alakasız bir durum.
İkincisi: git reset HEAD'in önceden önbelleğe alınmış dosya içeriklerini sihirli bir şekilde kurtaramayacağını unutmayın, sadece HEAD'den yeniden senkronize eder. Yanlış yönlendirilmiş git eklentimiz, önceki aşamalı taahhüt edilmemiş bir sürümün üzerine yazdıysa, onu kurtaramayız. Bu nedenle, kesinlikle konuşmak gerekirse, [*] işlemini geri alamayız.
Misal:
$ git init
$ echo "sürüm 1"> file.txt
$ git dosya.txt ekle # İlk dosya.txt eki
$ git commit -m 'ilk commit'
$ echo "sürüm 2"> file.txt
$ git add file.txt # Stage (işleme) file.txt "sürüm 2"
$ git diff - önbelleğe alınmış dosya.txt
-versiyon 1
+ sürüm 2
$ echo "sürüm 3"> file.txt
$ git diff file.txt
-versiyon 2
+ sürüm 3
$ git add file.txt # Oops bunu demek istemedik
$ git reset HEAD file.txt # Geri alınsın mı?
$ git diff --cached file.txt # Elbette dif yok. stage == HEAD
$ git diff file.txt # Geri alınamayacak şekilde "sürüm 2" yi kaybettik
-versiyon 1
+ sürüm 3
Elbette, sadece yeni dosyalar eklemek için 'git add' yapmanın olağan tembel iş akışını takip edersek (durum 1) ve yeni içeriği commit, git commit -a komutu ile güncellersek bu çok kritik değildir.
* (Düzenleme: Yukarıdakiler pratik olarak doğrudur, ancak yine de aşamalı olan, ancak taahhüt edilmeyen ve sonra üzerine yazılan değişiklikleri kurtarmak için biraz kesilmiş / karışık yollar olabilir - Johannes Matokic ve iolsmit'in yorumlarına bakın)
|
Önceden eklenmiş bir dosyayı geri almak Git kullanarak oldukça kolaydır. Zaten eklenmiş olan dosyam.txt dosyasını sıfırlamak için şunu kullanın:
git reset HEAD myfile.txt
Açıklama:
İstenmeyen dosyaları hazırladıktan sonra, geri almak için git reset yapabilirsiniz. Head, dosyanızın yerelde başıdır ve son parametre, dosyanızın adıdır.
Aşağıdaki resimde bulunan adımları, bu durumlarda meydana gelebilecek tüm adımlar dahil olmak üzere sizin için daha ayrıntılı olarak oluşturdum:
|
git rm --cached. -r
mevcut dizininizden eklediğiniz her şeyi özyinelemeli olarak "kaldırır"
|
Çalıştırmak
git gui
ve tüm dosyaları manuel olarak veya hepsini seçerek ve kaydetme düğmesinden unstage düğmesine tıklayarak kaldırın.
|
Soru açıkça sorulmuyor. Bunun nedeni, git add'nin iki anlamı olmasıdır:
hazırlama alanına yeni bir dosya ekledikten sonra git rm --cached file ile geri alın.
hazırlama alanına değiştirilmiş bir dosya eklemek, ardından git reset HEAD dosyasıyla geri almak.
Şüpheniz varsa kullanın
git reset HEAD dosyası
Çünkü her iki durumda da beklenen şeyi yapıyor.
Uyarı: değiştirilmiş bir dosyada git rm --cached file yaparsanız (daha önce depoda bulunan bir dosya), dosya git commit! Dosya sisteminizde hala var olacaktır, ancak başka biri sizin taahhüdünüzü alırsa, dosya çalışma ağacından silinecektir.
git status, dosyanın yeni bir dosya mı yoksa değiştirilmiş mi olduğunu size söyleyecektir:
Şube yöneticisinde
Yapılması gereken değişiklikler:
(aşamadan çıkmak için "git reset HEAD  ..." kullanın)
yeni dosya: my_new_file.txt
değiştirildi: my_modified_file.txt
|
Git'in akla gelebilecek her eylem için komutları vardır, ancak işleri doğru yapmak için kapsamlı bilgiye ihtiyacı vardır ve bu nedenle en iyi ihtimalle mantıksızdır ...
Daha önce ne yaptın:
Bir dosya değiştirildi ve git add. Veya git add  kullanıldı.
Ne istiyorsunuz:
Dosyayı dizinden kaldırın, ancak versiyonunu koruyun ve çalışma kopyasında taahhüt edilmeyen değişikliklerle bırakın:
git reset HEAD 
Dosyayı HEAD'den son durumuna sıfırlayın, değişiklikleri geri alın ve dizinden kaldırın:
# "Svn revert " IIRC'yi düşünün.
git reset HEAD 
git checkout 
# "" gibi bir "" a sahipseniz, şunu kullanın:
git checkout - 
Git reset --hard HEAD tekli dosyalarla çalışmayacağı için bu gereklidir.
 dosyasını dizin ve sürüm oluşturmadan kaldırarak sürümü kaldırılmış dosyayı çalışma kopyasındaki değişikliklerle birlikte koruyun:
git rm --cached 
 dosyasını çalışan kopyalama ve sürüm oluşturma işleminden tamamen kaldırın:
git rm 
|
İlk taahhüdünüzdeyseniz ve git'i kullanamıyorsanızsıfırlayın, sadece "Git iflasını" ilan edin ve .git klasörünü silin ve baştan başlayın
|
Diğer cevapların çoğuna göre git reset kullanabilirsiniz
FAKAT:
Git unadd için Git komutunu (bir takma ad) ekleyen bu harika küçük gönderiyi buldum: ayrıntılar için git unadd'a bakın veya ..
Basitçe,
git config --global alias.unadd "HEAD'i sıfırla"
Şimdi yapabilirsin
git unadd foo.txt bar.txt
|
Yeni eklenen dosyaları yaklaşan kaydetmenizden kaldırmak için git add -i kullanın. Misal:
İstemediğiniz dosyayı eklemek:
$ git foo ekle
$ git durumu
# Şube yöneticisinde
# Yapılması gereken değişiklikler:
# (aşamadan çıkmak için "git reset HEAD  ..." kullanın)
#
# yeni dosya: foo
#
# İzlenmeyen dosyalar:
# (kaydedilecek olanı eklemek için "git add  ..." kullanın)
# [...] #
Eklemenizi geri almak için etkileşimli eklemeye giriliyor (buraya yazılan komutlar "r" (geri döndürme), "1" (listedeki ilk giriş geri dönüş gösteriliyor), geri dönme modundan çıkmak için 'geri dön' ve "q" (çık):
$ git ekle -i
aşamalı aşamalı olmayan yol
1: + 1 / -0 hiçbir şey foo
*** Komutlar ***
1: [s] tatus 2: [u] tarih 3: [r] evert 4: [a] gg izlenmemiş
5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp
Şimdi ne> r
aşamalı aşamalı olmayan yol
1: + 1 / -0 hiçbir şey [f] oo
Geri Döndür >> 1
aşamalı aşamalı olmayan yol
* 1: + 1 / -0 hiçbir şey [f] oo
Geri Döndür >>
not: foo artık izlenmiyor.
bir yol geri döndü
*** Komutlar ***
1: [s] tatus 2: [u] tarih 3: [r] evert 4: [a] gg izlenmemiş
5: [p] atch 6: [d] iff 7: [q] uit 8: [h] elp
Şimdi ne var> q
Hoşçakal.
$
Bu kadar! İşte "foo" nun izlenmeyenler listesine geri döndüğünü gösteren kanıtınız:
$ git durumu
# Şube yöneticisinde
# İzlenmeyen dosyalar:
# (kaydedilecek olanı eklemek için "git add  ..." kullanın)
# [...]
# foo
commit için hiçbir şey eklenmemiş ancak izlenmemiş dosyalar mevcut (izlemek için "git add" kullanın)
$
|
git remove veya git rm --cached bayrağı ile bunun için kullanılabilir. Deneyin:
git yardım rm
|
İşte yeni bir projeye başladığınızda bu can sıkıcı sorunu önlemenin bir yolu:
Yeni projeniz için ana dizini oluşturun.
Git init'i çalıştırın.
Şimdi bir .gitignore dosyası oluşturun (boş olsa bile).
.Gitignore dosyanızı kaydedin.
Git, herhangi bir taahhüdünüz yoksa git sıfırlamayı gerçekten zorlaştırır. Sadece bir tane sahip olmak uğruna küçük bir ilk commit oluşturursanız, her şeyi doğru yapmak için istediğiniz kadar git add -A ve git reset yapabilirsiniz.
Bu yöntemin bir başka avantajı, daha sonra satır sonlandırma sorunlarıyla karşılaşırsanız ve tüm dosyalarınızı yenilemeniz gerekirse, kolay olmasıdır:
Bu ilk taahhüdü kontrol edin. Bu, tüm dosyalarınızı kaldıracaktır.
Ardından, en son işleminize tekrar göz atın. Bu, mevcut satır sonu ayarlarınızı kullanarak dosyalarınızın yeni kopyalarını alacaktır.
|
Belki de sorunuzu gönderdiğinizden beri Git gelişti.
$> git --version
git sürüm 1.6.2.1
Şimdi deneyebilirsiniz:
git sıfırlama KAFA.
Aradığınız şey bu olmalı.
|
Bir revizyon belirtemezseniz, bir ayırıcı eklemeniz gerektiğini unutmayın. Konsolumdan örnek:
git sıfırlama 
ölümcül: belirsiz bağımsız değişken '': bilinmeyen revizyon veya çalışma ağacında olmayan yol.
Yolları revizyonlardan ayırmak için '-' kullanın
git sıfırlama - 
Sıfırlamadan sonra aşamalı olmayan değişiklikler:
M 
(Git sürüm 1.7.5.4)
|
Yeni dosyaları hazırlama alanından (ve yalnızca yeni bir dosya olması durumunda) yukarıda önerildiği gibi kaldırmak için:
git rm - önbelleğe alınan DOSYA
Rm --cached'i yalnızca yanlışlıkla eklenen yeni dosyalar için kullanın.
|
Belirli bir klasördeki (ve alt klasörlerindeki) her dosyayı sıfırlamak için aşağıdaki komutu kullanabilirsiniz:
git sıfırla *
|
Aynı anda birden çok dosyayı işlemek için * komutunu kullanın:
git reset KAFA * .prj
git reset BAŞLIK * .bmp
git reset BAŞLIK * gdb *
vb.
|
Sadece git reset yaz, geri dönecek ve sanki git add yazmamışsın gibi. son işinizden beri. Daha önce taahhüt ettiğinizden emin olun.
|
Yeni bir dosya oluşturduğumu varsayalım, newFile.txt:
Dosyayı yanlışlıkla eklediğimi varsayalım, git add newFile.txt:
Şimdi, kaydetmeden önce bu eklentiyi geri almak istiyorum, git reset newFile.txt:
|
Belirli bir dosya için:
git reset my_file.txt
git checkout my_file.txt
Eklenen tüm dosyalar için:
git sıfırla.
git checkout.
Not: teslim alma, dosyalardaki kodu değiştirir ve son güncellenen (kaydedilen) duruma geçer. sıfırlama kodları değiştirmez; sadece başlığı sıfırlar.
|
Git eklemeyi geri almak için şunu kullanın:
git sıfırlama dosya adı
|
Bu komut, değişikliklerinizi kaldıracak:
git reset HEAD dosya adı.txt
Ayrıca kullanabilirsin
git eklenti -p
dosya parçaları eklemek için.
|
Ayrıca etkileşimli mod da vardır:
git eklenti -i
Dosyaları eklemeyi geri almak için 3. seçeneği seçin. Benim durumumda genellikle birden fazla dosya eklemek isterim ve etkileşimli modda dosya eklemek için bunun gibi sayıları kullanabilirsiniz. Bu 4: 1, 2, 3 ve 5 dışındaki her şeyi alacak
Bir sıra seçmek için, hepsini 1'den 5'e almak üzere 1-5 yazmanız yeterlidir.
Git hazırlık dosyaları
|
git add myfile.txt # Bu, dosyanızı kaydedilecekler listesine ekleyecektir
Bu komutun tam tersi,
git reset HEAD myfile.txt # Bu geri alınacako.
yani, önceki durumda olacaksınız. Belirtilenler tekrar izlenmeyenler listesinde olacaktır (önceki durum).
Kafanızı belirtilen dosya ile sıfırlayacaktır. yani, kafanız buna sahip değilse, basitçe onu sıfırlayacaktır.
|
git reset dosyaadı.txt
Dosyaadı.txt adlı bir dosyayı, başka hiçbir şeyi değiştirmeden geçerli dizinden, "işlenmek üzere" alanından kaldırır.
|
git reset dosyaadı.txt
Dosyaadı.txt adlı bir dosyayı, başka hiçbir şeyi değiştirmeden geçerli dizinden, "işlenmek üzere" alanından kaldırır.
|
Sourcetree'de bunu GUI aracılığıyla kolayca yapabilirsiniz.
Sourcetree'nin bir dosyanın aşamalarını geri almak için kullandığı komutu kontrol edebilirsiniz.
Yeni bir dosya oluşturdum ve Git'e ekledim. Sonra Sourcetree GUI'yi kullanarak aşamalandırdım.
Sonuç şu:
Dosyaların aşamalarını geri alma [08/12/15 10:43]
git -c diff.mnemonicprefix = false -c core.quotepath = false -c kimlik bilgileri.helper = kaynak ağacı sıfırlama -q - / dosya / dosyaadı.java yolu
Sourcetree, yeni dosyaların aşamalarını kaldırmak için sıfırlamayı kullanır.
|
1
2
Sonraki
Oldukça aktif soru. Bu soruyu cevaplamak için 10 itibar kazanın. İtibar koşulu, bu sorunun istenmeyen postalardan ve yanıtlanmayan etkinliklerden korunmasına yardımcı olur.
Aradığın cevap değil mi? Git version-control git-commit git-stage etiketli diğer sorulara göz atın veya kendi sorunuzu sorun.